package com.example.barcodeapp.utils;

import android.util.Log;
import android.widget.TextView;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.example.barcodeapp.app.MyApp;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


/**
 * FileName: LocationGDUtil
 * Author: LJT
 * Date: 2019/10/7 9:13
 * Description: 高德地图定位
 */


public class LocationGDUtil {
    //声明AMapLocationClient类对象
    private static AMapLocationClient mLocationClient = null;
    private static ILocationListener listener=null;
    //声明定位回调监听器
    private static AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (amapLocation != null) {
                if (amapLocation.getErrorCode() == 0) {
                    //可在其中解析amapLocation获取相应内容。
                    Map<String, Object> map = new HashMap<>();
                    amapLocation.getLocationType();//获取当前定位结果来源，如网络定位结果，详见定位类型表
                    double latitude= amapLocation.getLatitude();//获取纬度
                    map.put("latitude", latitude);
                    double longitude=amapLocation.getLongitude();//获取经度
                    map.put("longitude", latitude);
                    amapLocation.getAccuracy();//获取精度信息
                    amapLocation.getAddress();//地址，如果option中设置isNeedAddress为false，则没有此结果，网络定位结果中会有地址信息，GPS定位不返回地址信息。
                    amapLocation.getCountry();//国家信息
                    String country = amapLocation.getProvince();//省信息
                    map.put("country", country);

                    String city = amapLocation.getCity();//城市信息
                    map.put("city", city);

                    String spain = amapLocation.getDistrict();//城区信息
                    map.put("spain", spain);

                    String street =amapLocation.getStreet();//街道信息
                    map.put("street", street);

                    String StreetNum =amapLocation.getStreetNum();//街道门牌号信息
                    map.put("StreetNum", StreetNum);
                    amapLocation.getCityCode();//城市编码
                    amapLocation.getAdCode();//地区编码
                    amapLocation.getAoiName();//获取当前定位点的AOI信息
                    amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
                    amapLocation.getFloor();//获取当前室内定位的楼层
                    amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
                    //获取定位时间
                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(amapLocation.getTime());
                    df.format(date);
                    if (null != tvLocation) {
                        tvLocation.setText(city);
                    }
                    if (listener != null) {
                        listener.locationCity(map);
                    }
                    Log.i("locationMessage", country+city+spain);
                } else {
                    //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
                    Log.e("AmapError", "location Error, ErrCode:"
                            + amapLocation.getErrorCode() + ", errInfo:"
                            + amapLocation.getErrorInfo());
                }
            }
        }
    };
    private static TextView tvLocation;
    public static void setTextView(TextView textView) {
        tvLocation = textView;
    }
    public static void getLocation() {
        //初始化定位
        mLocationClient = new AMapLocationClient(MyApp.getInstance().getApplicationContext());
        //设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);
        //设置定位场景
        AMapLocationClientOption option = new AMapLocationClientOption();
        /**
         * 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
         */
        // option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
        //设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式 会同时使用网络定位和GPS定位，优先返回最高精度的定位结果，以及对应的地址描述信息。
        option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

        //设置定位模式为AMapLocationMode.Battery_Saving，低功耗模式 不会使用GPS和其他传感器，只会使用网络定位（Wi-Fi和基站定位）；。
        //option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);

        //获取一次定位结果：
        //该方法默认为false。
         option.setOnceLocation(true);

        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
        //option.setOnceLocationLatest(true);

        //关闭缓存机制
        option.setLocationCacheEnable(false);

        if (null != mLocationClient) {
            mLocationClient.setLocationOption(option);
            //设置场景模式后最好调用一次stop，再调用start以保证场景模式生效
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        }
    }
    public static void setLocationListener(ILocationListener iLocationListener) {
        listener = iLocationListener;
        getLocation();
    }

    public interface ILocationListener {
        void locationCity(Map<String, Object> map);
    }
    public static void destoryLocation() {
        if (mLocationClient != null) {
            mLocationClient.onDestroy();
        }
    }

    public static void stopLocation() {
        if (mLocationClient != null) {
            mLocationClient.stopLocation();
        }
    }

}
